function [h,f,xx] = pltdens(x,h,positive,kernel)
% PURPOSE: Draw a nonparametric density estimate. 
%---------------------------------------------------
% USAGE: [h f y] = pltdens(x,h,p,kernel)
%        or pltdens(x) which uses gaussian kernel default
% where:
%        x is a vector
%        h is the kernel bandwidth 
%          default=1.06 * std(x) * n^(-1/5); Silverman page 45
%        p is 1 if the density is 0 for negative values
%        k is the kernel type:
%          =1 Gaussian (default)
%        =2 Epanechnikov 
%        =3 Biweight
%        =4 Triangular
%   A jittered plot of the 
%   observations is shown below the density.
%---------------------------------------------------
% RETURNS:
%        h = the interval used
%        f = the density
%        y = the domain of support
%        plot(y,f) will produce a plot of the density
% --------------------------------------------------
% SEE ALSO hist, histo
%---------------------------------------------------

%       Anders Holtsberg, 18-11-93
%       Copyright (c) Anders Holtsberg

x = x(:); n = length(x);
if nargin < 4, kernel = 1; end
if nargin < 3, positive = 0; end
if nargin < 2, h = []; end
if isempty(h)
   h = 1.06 * std(x) * n^(-1/5);  % Silverman page 45
end
if positive & any(x < 0)
   error('There is a negative element in X')
end
mn1 = min(x); mx1 = max(x);
mn = mn1 - (mx1-mn1)/3;
mx = mx1 + (mx1-mn1)/3;
gridsize = 256;
xx = linspace(mn,mx,gridsize)';
d = xx(2) - xx(1);
xh = zeros(size(xx));
xa = (x-mn)/(mx-mn)*gridsize;
for i=1:n
   il = floor(xa(i));
   a  = xa(i) - il;
   xh(il+[1 2]) = xh(il+[1 2])+[1-a, a]';
end
xk = [-gridsize:gridsize-1]'*d;
if kernel == 1
   K = exp(-0.5*(xk/h).^2);
elseif kernel == 2 
   K = max(0,1-(xk/h).^2/5);
elseif kernel == 3
   c = sqrt(1/7);
   K = (1-(xk/h*c).^2).^2 .* ((1-abs(xk/h*c)) > 0);
elseif kernel == 4 
   c = sqrt(1/6);
   K = max(0,1-abs(xk/h*c));
end
K = K / (sum(K)*d*n);
f = ifft(fft(fftshift(K)).*fft([xh ;zeros(size(xh))]));
f = real(f(1:gridsize));
if positive
   m = sum(xx<0);
   f(m+(1:m)) = f(m+(1:m)) + f(m:-1:1);
   f(1:m) = zeros(size(f(1:m)));
   xx(m+[0 1]) = [0 0];
end
if nargout == 0
plot(xx,f)
 if ~ishold
   hold on
   d = diff(get(get(gcf,'CurrentAxes'),'Ylim'))/100;
   plot(x,(-rand(size(x))*6-1)*d,'.')
   plot([mn mx],[0 0])
   axis([mn mx -0.2*max(f) max(f)*1.2])
   hold off
 end
end;
